/*
 * @Author: your name
 * @Date: 2022-02-04 22:29:14
 * @LastEditTime: 2022-02-04 22:35:33
 * @LastEditors: Please set LastEditors
 * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 * @FilePath: \ts\14断言和声明区别.ts
 */
// 六、类型断言 VS 类型声明
function getCacheData(key: string): any {
    // return (window as any).cache[key];
    return {
        name:key,
        run() {
            console.log('2')
        }
    }
}
interface Cat {
    name: string;
    run(): void;
}
const tom1 = getCacheData('tom') as Cat;
const tom2:Cat = getCacheData('tom'); // 返回的是any类型，可以声明称其他类型

console.log(tom1, tom2)

// 区别
interface Animal{
    name:string;
}
interface Cat {
    name:string;
    run():void;
}
const animal4:Animal = {
    name:"tom"
}
const tom4 = animal4 as Cat;
console.log(tom4)
const tom7 = tom2 as Animal // 互相断言
// 类型声明
// const tom6:Cat = animal;报错
//Property 'run' is missing in type 'Animal' but required in type 'Cat'

// Animal兼容Cat，所以可以将animal断言为Cat，赋值给tom。但直接申明tom为Cat类型是不可以的。

// 深入的讲，它们的核心区别就在于：

// animal 断言为 Cat，只需要满足 Animal 兼容 Cat 或 Cat 兼容 Animal 即可
// animal 赋值给 tom，需要满足 Cat 兼容 Animal 才行
// 但是 Cat 并不兼容 Animal。